/**
 * 校验是否不为 null undefined ''
 * @param target 原数据 null
 * @returns 是否为null/undefined/NaN/'' false
 */
const IsNotNull = (target: any) => {
  let result = true
  switch (target) {
    case undefined:
    case null:
    case NaN:
      result = false
      break
  }
  if (result) {
    if (String(target).replace(/\s+/g, '') == '') {
      result = false
    }
  }
  return result
}

/**
 * 校验是否不为空对象
 * @param target 原对象
 * @returns {} true
 */
const isNotEmptyObj = (obj: any) => {
  for (const key in obj) {
    return true
  }
  return false
}

/**
 * 返回指定数据类型的默认值
 * @param param 需校验的参数
 * @returns 返回默认值
 */
const TypeDefault = (param: any, def: string | number | Array<any> = 0) => {
  return typeof param == 'number'
    ? def
    : param instanceof Array
    ? []
    : param instanceof Object
    ? {}
    : ''
}

const CloneDeep = (obj) => {
  //   筛选，如果是引用数据类型则进入if
  if (Array.isArray(obj) || typeof obj === "object") {
    // 创建变量接受深拷贝数据，如果obj是数组，则变量初始化为数组
    let cloneObj = Array.isArray(obj) ? [] : {};
    //   将变量进行遍历
    Object.keys(obj).forEach(function(key) {
      //   如果被拷贝对象为引用数据，则将递归后的数据放入对应的键内
      if (Array.isArray(obj[key]) || typeof obj[key] === "object") {
        cloneObj[key] = CloneDeep(obj[key]);
      } else {
        //否则直接拷贝键值
        cloneObj[key] = obj[key];
      }
    });
    //   然后返回拷贝后的对象
    return cloneObj;
  } else {
    // 普通数据直接返回
    return obj;
  }
}
export { IsNotNull, isNotEmptyObj, TypeDefault, CloneDeep }
